# -*- coding: utf-8 -*-            
# @Time : 2024/9/11 15:09
# @FileName: settings.py
# @Target:
import os
import json, codecs, time, requests, os

# MongoDB Settings
mongodb_host = os.getenv('MONGODB_HOST', "123.58.213.162")
mongodb_port = os.getenv('MONGODB_PORT', 27017)

# translator settings
translator_host = os.getenv('TRANSLATOR_HOST', "152.32.135.145")

# Qwen
Qwen_host = os.getenv('QWEN_HOST', "117.50.174.71")
Qwen_URL = "http://{host}:8000/v1/chat/completions".format(host=Qwen_host)
qwen_max_retries = 3
qwen_delay = 0.1

MISSING = '客户反馈不在当前标签列表范围内'

# quality labels
class LABELS:
    def __init__(self):
        HOST = os.getenv('LABEL_HOST', '123.58.213.162')
        self.quality_labels_zh_url = "http://{host}:17400/quality_labels_zh".format(host=HOST)
        self.quality_labels_en_url = "http://{host}:17400/quality_labels_en".format(host=HOST)
        self.quality_label_zh2en_url = "http://{host}:17400/quality_label_zh2en".format(host=HOST)

        self.csp_labels_zh_url = "http://{host}:17400/csp_labels_zh".format(host=HOST)
        self.csp_labels_convert_url = "http://{host}:17400/csp_labels_convert".format(host=HOST)

    @property
    def quality_labels_zh(self):
        res = requests.get(self.quality_labels_zh_url)
        return json.loads(res.content.decode('utf-8'))

    @property
    def quality_labels_en(self):
        res = requests.get(self.quality_labels_en_url)
        return json.loads(res.content.decode('utf-8'))

    @property
    def quality_labels_translate(self):
        res = requests.get(self.quality_label_zh2en_url)
        return json.loads(res.content.decode('utf-8'))

    @property
    def csp_labels_zh(self):
        res = requests.get(self.csp_labels_zh_url)
        return json.loads(res.content.decode('utf-8'))

    @property
    def csp_labels_convert(self):
        res = requests.get(self.csp_labels_convert_url)
        return json.loads(res.content.decode('utf-8'))

    @property
    def clarify_labels(self):
        return [
            '客户反馈和车辆相关',
            '客户反馈和车辆不相关',
            '客户反馈中无法判断是否和车辆相关'
        ]

    @property
    def purchase_labels(self):
        return [
            '客户完全不想购买该车辆',
            '购买该车辆意愿一般，当满足一些条件（如降价，提升配置，提升销售服务，改善外观内饰等）后会购买该车辆',
            '购买该车辆意愿强（如满意该车的外观，售价，内饰，销售服务等）',
            '已经购买该车辆或者已经预付车辆购买定金（用车感受，车辆功能描述，用车行为，用车故障等均可视为该标签）',
            '从客户反馈中无法识别客户购车意愿'
        ]

    @property
    def clarify_quality(self):
        return [
            '客户没有抱怨车辆质量问题',
            '客户抱怨车辆质量问题'
        ]

    @property
    def sentiment_labels(self):
        return [
            '正向情感',
            '中性情感',
            '负向情感'
        ]


labels = LABELS()

label_quality_labels_zh = labels.quality_labels_zh
label_quality_labels_en = labels.quality_labels_en
label_quality_labels_translate = labels.quality_labels_translate
label_csp_labels_zh = labels.csp_labels_zh
label_csp_labels_convert = labels.csp_labels_convert

label_clarify_labels = labels.clarify_labels
label_clarify_quality = labels.clarify_quality
label_purchase_labels = labels.purchase_labels

label_sentiment_labels = labels.sentiment_labels

class PROMPOT:
    def __init__(self,
                 quality_labels_zh=label_quality_labels_zh,
                 csp_labels_zh=label_csp_labels_zh,
                 clarify_labels=label_clarify_labels,
                 purchase_labels=label_purchase_labels,
                 clarify_quality=label_clarify_quality,
                 sentiment_labels=label_sentiment_labels
                 ):
        self.quality_labels_zh = quality_labels_zh
        self.csp_labels_zh = csp_labels_zh
        self.clarify_labels = clarify_labels
        self.purchase_labels = purchase_labels
        self.clarify_quality = clarify_quality
        self.sentiment_labels = sentiment_labels

    def clarify_quality(self,
                         customer_voice,
                         labels):
        """
        判断当前客户反馈是否有质量类型问题
        """
        if not labels:
            labels = self.clarify_quality
        FORMAT = """任务: 对以下客户反馈进行单标签文本分类，识别客户反馈是否在抱怨车辆质量问题。
客户反馈: {customer_voice}
可供选择的标签列表: {labels}。
要求:
1.根据客户反馈选择最相关的标签，来识别客户反馈是否在抱怨车辆质量问题。
2.确认为单标签文本分类，不要多选，不要生成不在标签列表的标签。
输出格式示例:['标签']
"""
        return FORMAT.format(customer_voice=customer_voice,
                             labels=str(labels))

    def clarify_prompt(self,
                        customer_voice,
                        labels):
        """
        依据原始语句，判断当前语句识别客户反馈是否和车辆相关
        """
        if not labels:
            labels = self.clarify_labels
        FORMAT = """任务: 对以下客户反馈进行单标签文本分类，识别客户反馈是否和车辆相关。
客户反馈: {customer_voice}
可供选择的标签列表: {labels}。
要求:
1.根据客户反馈从可供选择的标签列表中选择最相关的标签，来识别客户反馈是否和车辆相关。
2.确认为单标签文本分类，不要多选，不要生成不在标签列表的标签。
输出格式示例:['标签']
"""
        return FORMAT.format(customer_voice=customer_voice,
                             labels=str(labels))

    def purchase_prompt(self,
                         customer_voice,
                         labels):
        if not labels:
            labels = self.purchase_labels
        FORMAT = """任务: 对以下客户反馈进行单标签文本分类，识别客户购买该车辆意愿。
客户反馈: {customer_voice}
可供选择的标签列表: {labels}。
要求: 
1.根据客户反馈从可供选择的标签列表中选择最相关的标签，来识别客户反馈表达的购车意愿。
2.确认为单标签文本分类，不要多选，不要生成不在标签列表的标签。
输出格式示例:['标签']
"""
        return FORMAT.format(customer_voice=customer_voice,
                             labels=str(labels))

    def csp_1_prompt(self,
                      customer_voice,
                      labels):
        FORMAT = """任务: 对以下客户关于车辆功能反馈进行多标签分类，并从可供选择的标签列表中选择合适的标签进行标注。
客户车辆功能反馈: {customer_voice} 
可供选择的标签列表: {labels}。
要求: 
1.根据客户车辆功能反馈从可供选择的标签列表中选择最相关的标签。
2.如果客户车辆功能反馈涉及到多个方面，请从可供选择的标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(customer_voice=customer_voice, labels=labels)

    def csp_2_prompt(self,
                      customer_voice,
                      first_label,
                      labels
                      ):
        FORMAT = """任务: 对以下客户关于车辆功能反馈进行多标签分类，并从可供选择的标签列表中选择合适的标签进行标注。
客户车辆功能反馈:{customer_voice}
已知的上一级标签为:{first_label}。 
可供选择的标签列表:{labels}。
要求: 
1.根据客户车辆功能反馈和已知的上一级标签从可供选择的标签列表中选择最相关的标签。
2.如果客户车辆功能反馈涉及到多个方面，请从可供选择的标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(customer_voice=customer_voice,
                             first_label=first_label,
                             labels=labels)

    def feel_1_prompt(self,
                       customer_voice,
                       labels):
        FORMAT = """任务: 对以下客户关于车辆使用感受反馈进行多标签分类，并从预定义的使用感受标签列表中选择合适的标签进行标注。
客户车辆使用感受反馈: {customer_voice}
可供选择的使用感受标签列表: {labels}
要求: 
1.根据客户车辆使用感受反馈从可供选择的使用感受标签列表中选择最相关的标签。
2.如果客户车辆使用感受反馈涉及到多个方面，请从可供选择的使用感受标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(customer_voice=customer_voice, labels=labels)

    def feel_2_prompt(self,
                       customer_voice,
                       first_label,
                       labels):
        FORMAT = """任务: 对以下客户关于车辆使用感受反馈进行多标签分类，并从预定义的使用感受标签列表中选择合适的标签进行标注。
客户车辆使用感受反馈: {customer_voice}
已知的上一级标签为：{first_label}。 
可供选择的使用感受标签列表: {labels}
要求: 
1.根据客户车辆使用感受反馈和已知的上一级标签从可供选择的使用感受标签列表中选择最相关的标签。
2.如果客户车辆使用感受反馈涉及到多个方面，请从可供选择的使用感受标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(customer_voice=customer_voice, first_label=first_label, labels=labels)

    def quality_1_prompt(self,
                          customer_voice,
                          labels):
        FORMAT = """任务: 对以下客户关于车辆质量抱怨问题的反馈进行多标签分类，并从预定义的标签列表中选择合适的标签进行标注。
客户反馈: {customer_voice}
可供选择的标签列表: {labels}
要求: 
1.根据客户负面车辆质量抱怨反馈从可供选择的标签列表选择最相关的标签。
2.如果负面质量抱怨反馈涉及到多个方面，请从可供选择的标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(
            customer_voice=customer_voice,
            labels=labels
        )

    def quality_2_prompt(self,
                          customer_voice,
                          first_label,
                          labels):
        FORMAT = """任务: 对以下客户关于车辆质量抱怨问题的反馈进行多标签分类，并从预定义的标签列表中选择合适的标签进行标注。
客户反馈: {customer_voice}
已知的一级标签: {first_label}
可供选择的标签列表: {labels}
任务: 
1.根据客户负面车辆质量抱怨反馈从可供选择的标签列表选择最相关的标签。
2.如果负面质量抱怨反馈涉及到多个方面，请从可供选择的标签列表中选择所有适用的标签。
3.输出标签列表中元素的顺序可以任意排列。
输出格式示例:['标签1', '标签2', '标签3']
"""
        return FORMAT.format(
            customer_voice=customer_voice,
            first_label=first_label,
            labels=labels
        )

    def ner_prompt(self,
                    customer_voice,
                    labels):
        FORMAT = """任务: 从给定的客户反馈中提取与指定标签相关的文本段落。
客户反馈: {customer_voice}
指定标签: {labels}
要求:
1.提取与'{labels}'相关的描述。
2.不要添加任何额外的信息或创造任何新的句子。
3.如果有客户反馈中有多处不相邻描述和'{labels}'相关，均提取并使用列表方式输出。
4.忽略与'{labels}'不相关的其他信息。
输出格式示例:['描述1', '描述2']
"""
        return FORMAT.format(customer_voice=customer_voice, labels=labels)

    def sentiment_prompt(self,
                          customer_voice,
                          content,
                          labels
                          ):
        if not labels:
            labels = self.sentiment_labels
        FORMAT = """任务: 从给定的客户反馈，识别与指定内容相关的情感倾向['正向情感', '中性情感', '负向情感']。
客户反馈: {customer_voice}
指定内容: {content}
可供选择的情感倾向列表: {labels}
要求:
1.识别客户描述中与'{content}'相关的情感倾向。
2.确认为单标签文本分类，不要多选，不要生成不在标签列表的标签。
输出格式示例:['描述1', '描述2']"""
        return FORMAT.format(customer_voice=customer_voice,
                             content=content,
                             labels=labels)

prompt_toolkit = PROMPOT()



